package chai.ning.immutable;
/**
 * 1、不可变模式: 不可变类 和 不可变对象
 * 2、工厂模式 : 静态工厂方法( static factory method):用一个类方法来返回当前类的实例
 * 3、使用类变量缓存一组实例(使用数组实现)
 * 4、通过类初始化器完成对数组中各个元素的初始化
 */
public final class Decimal {
	
	// ctrl + shift + x : 被选中的英文字母全部转大写
	// ctrl + shift + y : 被选中的英文字母全部转小写
	private static final Decimal[] CACHE = new Decimal[ 256 ];
	
	// 类初始化器
	static {
		for( int i = 0 ; i < 256 ; i++ ) {
			// System.out.println( (byte) i );
			byte b = (byte) i ;
			CACHE[ i ] = new Decimal( b );
		}
		// System.out.println( java.util.Arrays.toString( CACHE ) );
	}
	
	private final long value ; // 实例变量value用于存储基本数据类型的数值
	
	private Decimal( long value ) {
		super();
		this.value = value ;
	}
	
	// 用一个类方法来返回当前类的实例
	public static Decimal valueOf( long value ) {
		if( value >= 0 && value < 128 ) {
			return CACHE[ (int)value ]; // 数组下标只能使用int类型
		} else if ( value < 0 && value >= -128 ) {
			long index = value + 256 ;
			return CACHE[ (int)index ];
		} else {
			Decimal d = new Decimal( value );
			return d ;
		}
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + (int) (value ^ (value >>> 32));
		return result;
	}

	@Override
	public boolean equals(Object o) {
		if( o instanceof Decimal ) {
			Decimal other = (Decimal) o ;
			return this.value == other.value ;
		}
		return false;
	}

	@Override
	public String toString() {
		// return "Decimal[value=" + value + "]";
		return "" + this.value ;
	}
	
	public static void main(String[] args) {
		
		Decimal d = new Decimal( 100 );
		// d.value = 1000 ; // The final field Decimal.value cannot be assigned
		System.out.println( d ); // 100
		
		Decimal e = new Decimal( 100 );
		System.out.println( e ); // 100
		
		System.out.println( d == e ); // false
		System.out.println( d.equals( e ) ); // true
		
	}

}
